#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
污染类型数据JSON格式管理工具
支持从数据库导出数据到JSON文件，以及从JSON文件导入数据到数据库

使用方法:
    # 导出完整数据到JSON文件
    python scripts/pollution_types_json_manager.py export --output ./data/pollution_types_backup.json

    # 导出指定客户的数据
    python scripts/pollution_types_json_manager.py export --customer-id my_company --output ./data/my_company_types.json

    # 只导出污染类型数据
    python scripts/pollution_types_json_manager.py export --types-only --output ./data/types_only.json

    # 只导出样例数据
    python scripts/pollution_types_json_manager.py export --examples-only --output ./data/examples_only.json

    # 从JSON文件导入数据
    python scripts/pollution_types_json_manager.py import --input ./data/pollution_types_backup.json

    # 导入时清空现有数据
    python scripts/pollution_types_json_manager.py import --input ./data/pollution_types.json --clear-existing

    # 导入指定客户的数据
    python scripts/pollution_types_json_manager.py import --input ./data/my_company_types.json --customer-id my_company
"""

import sys
import os
import argparse
from pathlib import Path

# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

from services.pollution_type_import_export import pollution_type_import_export
from core.logging_config import get_logger

logger = get_logger("pollution_types_json_manager")


def handle_export(args):
    """处理导出操作"""
    try:
        if args.types_only:
            # 只导出污染类型数据
            count = pollution_type_import_export.export_pollution_types_to_json(
                args.output,
                customer_id=args.customer_id
            )
            print(f"成功导出 {count} 条污染类型数据到 {args.output}")

        elif args.examples_only:
            # 只导出样例数据
            count = pollution_type_import_export.export_examples_to_json(
                args.output,
                customer_id=args.customer_id,
                pollution_type_id=args.pollution_type_id
            )
            print(f"成功导出 {count} 条污染类型样例数据到 {args.output}")

        else:
            # 导出完整数据
            result = pollution_type_import_export.export_complete_data_to_json(
                args.output,
                customer_id=args.customer_id
            )
            print(f"成功导出完整数据到 {args.output}:")
            print(f"  污染类型: {result['types']} 条")
            print(f"  样例数据: {result['examples']} 条")
            print(f"  总计: {result['types'] + result['examples']} 条")

    except Exception as e:
        logger.error(f"导出失败: {str(e)}", exc_info=True)
        print(f"导出失败: {str(e)}")
        sys.exit(1)


def handle_import(args):
    """处理导入操作"""
    try:
        if args.types_only:
            # 只导入污染类型数据
            result = pollution_type_import_export.import_pollution_types_from_json(
                args.input,
                customer_id=args.customer_id,
                clear_existing=args.clear_existing
            )
            print(f"污染类型数据导入完成:")
            print(f"  成功: {result['success_count']} 条")
            print(f"  失败: {result['error_count']} 条")

            if result['errors']:
                print("错误详情:")
                for error in result['errors'][:5]:
                    print(f"  - {error}")
                if len(result['errors']) > 5:
                    print(f"  ... 还有 {len(result['errors']) - 5} 个错误")

        elif args.examples_only:
            # 只导入样例数据
            result = pollution_type_import_export.import_examples_from_json(
                args.input,
                customer_id=args.customer_id,
                clear_existing=args.clear_existing
            )
            print(f"污染类型样例数据导入完成:")
            print(f"  成功: {result['success_count']} 条")
            print(f"  失败: {result['error_count']} 条")

            if result['errors']:
                print("错误详情:")
                for error in result['errors'][:5]:
                    print(f"  - {error}")
                if len(result['errors']) > 5:
                    print(f"  ... 还有 {len(result['errors']) - 5} 个错误")

        else:
            # 导入完整数据
            result = pollution_type_import_export.import_complete_data_from_json(
                args.input,
                customer_id=args.customer_id,
                clear_existing=args.clear_existing
            )
            print(f"完整数据导入完成:")
            print(f"  污染类型: 成功 {result['types']['success_count']} 条, 失败 {result['types']['error_count']} 条")
            print(f"  样例数据: 成功 {result['examples']['success_count']} 条, 失败 {result['examples']['error_count']} 条")
            print(f"  总计: 成功 {result['total_success']} 条, 失败 {result['total_errors']} 条")

            if result['types']['errors'] or result['examples']['errors']:
                print("\n错误详情:")
                print("污染类型错误:")
                for error in result['types']['errors'][:3]:
                    print(f"  - {error}")
                print("样例数据错误:")
                for error in result['examples']['errors'][:3]:
                    print(f"  - {error}")

    except Exception as e:
        logger.error(f"导入失败: {str(e)}", exc_info=True)
        print(f"导入失败: {str(e)}")
        sys.exit(1)


def main():
    """主函数"""
    parser = argparse.ArgumentParser(
        description="污染类型数据JSON格式管理工具",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例用法:
  # 导出完整数据
  python %(prog)s export -o ./data/pollution_types.json

  # 导入数据
  python %(prog)s import -i ./data/pollution_types.json

  # 导入时清空现有数据
  python %(prog)s import -i ./data/pollution_types.json --clear-existing
        """
    )

    # 全局参数
    parser.add_argument("--customer-id", default="default", help="客户标识 (默认: default)")
    parser.add_argument("--verbose", "-v", action="store_true", help="详细输出")

    # 子命令
    subparsers = parser.add_subparsers(dest="command", help="可用命令", required=True)

    # 导出命令
    export_parser = subparsers.add_parser("export", help="导出数据到JSON文件")
    export_parser.add_argument("--output", "-o", required=True, help="输出文件路径")
    export_parser.add_argument("--types-only", action="store_true", help="只导出污染类型数据")
    export_parser.add_argument("--examples-only", action="store_true", help="只导出样例数据")
    export_parser.add_argument("--pollution-type-id", type=int, help="只导出指定污染类型的样例数据")

    # 导入命令
    import_parser = subparsers.add_parser("import", help="从JSON文件导入数据")
    import_parser.add_argument("--input", "-i", required=True, help="输入文件路径")
    import_parser.add_argument("--clear-existing", action="store_true", help="导入前清空现有数据")
    import_parser.add_argument("--types-only", action="store_true", help="只导入污染类型数据")
    import_parser.add_argument("--examples-only", action="store_true", help="只导入样例数据")

    args = parser.parse_args()

    # 设置日志级别
    if args.verbose:
        import logging
        logging.getLogger().setLevel(logging.DEBUG)

    # 执行相应命令
    if args.command == "export":
        handle_export(args)
    elif args.command == "import":
        handle_import(args)
    else:
        parser.print_help()
        sys.exit(1)


if __name__ == "__main__":
    main()